#include <stdio.h>
#include <stdlib.h>

// 打印二维数组, 必须是3列,行不固定。不通用
void print2DArray(int (*arr)[3], int row, int col)
{
    printf(">>>>2D Array:\n");
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// 通用打印二维数组
void print2DArray(int row, int col, int arr[row][col])
{
    printf(">>>>2D Array:\n");
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%5d ", arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// 矩阵转换: Amn -> Bnm.  m=5, n=8
void trsmat(int a[][8], int b[][5], int m, int n)
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            b[j][i] = a[i][j];
        }
    }
}

// 二维数组
void fun2DArray()
{
    // 二维数组存储的元素个数  2*3=6个
    // int arr[2][3] = {10, 20, 30, 40, 50, 60};
    // 推荐写法
    // int arr[2][3] = {{10, 20, 30}, {40, 50, 60}};
    // 若对所有元素赋值，那么第一维的长度可以不给出
    int arr[][3] = {{10, 20, 30}, {40, 50, 60}};
    print2DArray(2, 3, arr);
}

void init2DArray()
{
    // 部分元素赋值，未赋值的元素自动取“零”值
    // int x[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    // 未初始化时，必须指定一维、二维长度
    int x[3][4];

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            x[i][j] = i + j;
            printf("%d ", x[i][j]);
        }
        printf("\n");
    }
}

// 三维数组
void fun3DArray()
{
    int arr[2][2][2] = {10, 20, 30, 40, 50, 60};

    printf("3D Array:\n");
    // printing elements
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            for (int k = 0; k < 2; k++)
            {
                printf("%d ", arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n \n");
    }
}

void convertArray()
{
    int a[5][8];
    int start = 0;
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            a[i][j] = ++start;
        }
    }

    print2DArray(5, 8, a);

    // 初始化所有元素为0
    int b[8][5] = {};

    // 将5行8列，转换为8行5列
    trsmat(a, b, 5, 8);

    print2DArray(8, 5, b);
}

// 元素A[i][j] 是 i 行元素中的最小值，又是 j 列中的最大值，称此元素为矩阵的马鞍点。
void maxMin()
{
    int m = 4, n = 5;
    int A[m][n];
    int start = m * n;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            A[i][j] = --start;
        }
    }

    print2DArray(m, n, A);

    int max[m], min[n];
    // 求每行的最小值
    for (int i = 0; i < m; i++)
    {
        min[i] = A[i][0];
        for (int j = 1; j < n; j++)
        {
            // 小于最小值，则该值就是最小值
            if (A[i][j] < min[i])
            {
                min[i] = A[i][j];
            }
        }
    }

    // 求每列的最大值
    for (int i = 0; i < n; i++)
    {
        max[i] = A[0][i];
        for (int j = 1; j < m; j++)
        {
            // 大于最大值，则该值就是最大值
            if (A[j][i] > min[i])
            {
                min[i] = A[j][i];
            }
        }
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (min[i] == max[j])
            {
                printf("row: i=%d, clo: j=%d\n", (i + 1), (j + 1));
            }
        }
    }
}

int main()
{
    // fun2DArray();
    // fun3DArray();
    // maxMin();
    convertArray();
    return 0;
}
